Ce document prends comme paramètre la date du jour et la date du jour - 30 C’est une version de démo des fonctionnalités du package, et une exploration du code possible avant de faire le shiny

1 chargement des données

Les données seront chargées de 2023-01-03 à 2023-02-02

code tag tagstation libelle unite tablehisto isac pluvio
pontdecran 1902 19 Niveau Vilaine au Pont de Cran m B_PONT_DE_CRAN_NIVEAU TRUE FALSE
guenrouet 2000 20 Niveau Isac à Guenrouët m B_GUENROUET_NIVEAU TRUE FALSE
redon_ecluse 2100 21 Niveau Vilaine à l’écluse de Redon m B_REDONECLUSE_NIVEAU FALSE FALSE
vilaine_barrage 2507 25 Niveau Vilaine à Arzal m B_BARRAGE_NIVEAU FALSE FALSE
pluvio_isac_10min 2532 3 Pluvio Isac 10 min mm b_isac_pluvio FALSE TRUE
pluvio_isac_veille 2533 3 Pluvio Isac veille, pas toujours égales la somme des valeurs pluvio mm b_isac_pluvio FALSE FALSE
pluvio_barrage_10min 2530 25 Pluvio barrage 10 min mm b_barrage_pluvio FALSE TRUE
pluvio_barrage_veille 2531 25 Pluvio barrage, données à j-2 rapportées à 4:10 mm b_barrage_pluvio FALSE FALSE
isac_aval1 370 3 Niveau Vilaine aval Prévert (1) m b_isac_mesure TRUE FALSE
isac_amont2 371 3 Niveau Isac amont Prévert(2) m b_isac_mesure TRUE FALSE
isac_aval2 372 3 Niveau Vilaine aval Prévert (2) m b_isac_mesure FALSE FALSE
isac_amont1 369 3 Niveau Isac amont Prévert (1) m b_isac_mesure FALSE FALSE
isac_fonctionnement_cumul_p1 380 3 Isac fonctionnement cumulé pompe 1 h b_isac_mesure TRUE FALSE
isac_fonctionnement_cumul_p3 381 3 Isac fonctionnement cumulé pompe 2 h b_isac_mesure TRUE FALSE
isac_position_vanne_1 334 3 Isac position vanne 1 m b_isac_mesure TRUE FALSE
isac_position_vanne_2 358 3 Isac position vanne 2 m b_isac_mesure TRUE FALSE
isac_niveau_marais 384 3 Niveau Isac niveau marais (Le Clandre) m b_isac_niveaumarais TRUE FALSE

Il faut aussi demander à Cédric ou Benjamin les valeurs à mettre pour la connexion et les passer à la main comme ci-dessous.

pool <- pool::dbPool(
    drv = RMariaDB::MariaDB(),
    dbname = "archive_IAV",
    host = "demande à Cédric",
    username = "demande à Cédric le nom en lecture",
    password = "demande à Cédric le mot de passe hyper - secret",
    port=3306
)

Ci dessous un script de chargement, toute la première partie peut être évitée en passant les arguments de connexion comme indiqué dans le code ci-dessus.

Dans le programme de chargement tags = isac$tag[isac$isac] va chercher les données isac où isac$isac correspond aux valeurs en bleu dans le tableau des variables. Un choix peut être effectué en passant un vecteur de tag par exemple tag= c(1902, 2000, 369, 370, 371, 380, 381, 334, 358, 384) va rajouter la variable du tag 369 aux valeurs par défaut, c’est à dire la variable isac_amont_1.


if (params$work_with_db){
  if (!exists("mainpass")) mainpass <- getPass::getPass(msg = "main password")
  if (!exists("hostmysql")) {
    hostmysql. <- getPass::getPass(msg = "Saisir host")
    # ci dessous pour ne pas redemander au prochain tour
    hostmysql <- encrypt_string(string = hostmysql., key = mainpass)
  } else {
    hostmysql. <- decrypt_string(string = hostmysql, key = mainpass)
  }
  if (!exists("pwdmysql")) {
    pwdmysql. <- getPass::getPass(msg = "Saisir password")
    pwdmysql <- encrypt_string(string = pwdmysql., key = mainpass)
  }  else {
    # pass should be loaded
    pwdmysql. <- decrypt_string(string = pwdmysql, key = mainpass)
  }
  if (!exists("umysql")) {
    umysql. <- getPass::getPass(msg = "Saisir user")
    umysql <- encrypt_string(string = umysql., key = mainpass)
  } else {
    umysql. <- decrypt_string(string = umysql, key = mainpass)
  }
  # attention il faut avaoir définit mainpass <- "xxxxx"
  
  pool <- pool::dbPool(
      drv = RMariaDB::MariaDB(),
      dbname = "archive_IAV",
      host = hostmysql.,
      username = umysql.,
      password = pwdmysql.,
      port=3306
  )
  
  
  system.time(isac_dat <-
          load_isac(
              debut = as.POSIXct(
                  strptime(debut, format = "%Y-%m-%d")
              ),
              fin = as.POSIXct(
                  strptime(fin, format = "%Y-%m-%d")
              ),
              tags = isac$tag[isac$isac],
              con = pool
          ))
  pool::poolClose(pool)
} else {
  # chargement du jeu de données du package
  isac_dat <- SIVA::isac_dat
}# end if params$work_with_db

2 Niveaux Isac

Graphique des niveaux sur l’Isac.

which_niveau <- grep("Niveau", attributes(isac_dat)$libelle)+1
isac_dat_niveau <- isac_dat %>%  
  dplyr::select(1,all_of(which_niveau)) 


  rAmCharts::amTimeSeries(
    isac_dat_niveau, 
    'horodate',
    colnames(isac_dat_niveau)[2:ncol(isac_dat_niveau)],
    bullet = "round",
    color =   randomcoloR::distinctColorPalette(ncol(isac_dat_niveau)-1),
    #backgroundColor = "#40555E",
    #backgroundAlpha = 0.4,
    bulletSize =  4,
    aggregation = "Average",
    fillAlphas = 0.2,
    groupToPeriods = c('10mm', '30mm', 'hh', 'DD', 'MAX'),
    #  c('hh', 'DD', '10DD','MM','MAX'),
    linewidth = 0.2,
    legend = TRUE           
  ) %>%
    rAmCharts::setExport(enabled = TRUE)  
#> Warning in controlgroupToPeriods(groupToPeriods, difft): NAs introduits lors de
#> la conversion automatique

3 Traitement des données des pompes

Ci dessous calcul du fonctionnement des pompes,les valeurs sont des fonctionnement horaires rapportés toutes les dix minutes, traitement_isac traite les valeur abérrantes et permet le calcul du débit des pompes Les données de cumul ne sont dispo qu’après 2016, il n’y a pas de relation entre le temps de fonctionnement et les coûts. Voir ? traitement_isac. Dans la fonction traitement_isac voir les arguments, cout_elec en 2022 0.174 il s’agit du prix de l’electricité hors heures pleines et heures creuses. Voir aussi cout_carbone. La source du code est disponbile à voir aussi les sources : https://github.com/Eaux-et-Vilaine/SIVA/blob/main/R/traitement_isac.R

# traitement des données des pompes
isac_dat <- traitement_isac(isac_dat)
# Calcul du débit du vannage.
# noter les arguments hamont et haval qui peuvent être adaptés...

knitr::kable(head(isac_dat)) %>% kable_styling(bootstrap_options=c("hover","striped","condensed","responsive", "full_width"=FALSE))
horodate pontdecran guenrouet isac_amont2 isac_fonctionnement_cumul_p1 isac_fonctionnement_cumul_p3 isac_position_vanne_1 isac_position_vanne_2 isac_niveau_marais h t cout_euros cout_carbone Q_pompes
2020-01-01 00:00:00 1.702 2.736 2.42 NA NA 0.39 0.01 NA 0.718 0 0 0 0
2020-01-01 00:10:00 1.705 2.721 2.42 0 0 0.39 0.01 NA 0.715 0 0 0 0
2020-01-01 00:20:00 1.703 2.721 2.43 0 0 0.39 0.01 NA 0.727 0 0 0 0
2020-01-01 00:30:00 1.701 2.721 2.43 0 0 0.39 0.01 NA 0.729 0 0 0 0
2020-01-01 00:40:00 1.696 2.721 2.43 0 0 0.39 0.01 NA 0.734 0 0 0 0
2020-01-01 00:50:00 1.691 2.721 2.43 0 0 0.39 0.01 NA 0.739 0 0 0 0

4 Calcul du débit des vannes.

Les débits des vannes dépendent de la largeur de chacune des vannes. Les vannes ne sont pas fixes. La formule de Manning est utilisée pour le vannage, il peut y avoir deux fonctionnements. Par exemple pour la vanne 1 qui est légerement moins large et au centre de l’ouvrage : on calcule : Le choix des sondes amont et aval a une grande importance pour le calcul de débit, si possible utiliser les sondes proches de l’ouvrage.

\[\Delta = h_{amont} - h_{aval} \\ \begin{cases} \Delta \geq 0 \implies Q = C_{ma} h_{vanne} l \sqrt(2 g \Delta) \\ \Delta < 0 \implies Q = -C_{ma} h_{vanne} l \sqrt(-2 g \Delta) \end{cases}\]

Avec :

  • \(h_{vanne}\) = hauteur de vanne,
  • \(C_{ma}\) = coefficient de manning : 0.62,
  • \(l\) = largeur de la vanne i

Voir ? debit_vannes_isac pour plus de détails. voir aussi les sources : https://github.com/Eaux-et-Vilaine/SIVA/blob/main/R/debit_vannes_isac.R

5 Calcul des indicateurs au niveau du marais.

5.1 Continuité écologique

La fonction debit_vannes_isac calcule la continuité piscicole au niveau de la vanne à l’aide de la différence de niveau \(\Delta\) et de l’ouverture de la vanne. Si la vanne est ouverte de moins de 5 cm la migration est considérée comme impossible, au delà de 5 cm, le \(\Delta\) (en valeur absolue car il peut être négatif) détermine si les conditions de migration. En dessous de 30 cm la migration est considérée comme bonne, entre 30 cm et 50 cm elle est considérée comme difficile, au delà de 50 cm la migration est impossible. Les valeurs sont “1-transparente”, “2-difficile”, “3-bloquee” et “4-inf5cm”.

5.2 Accueil hivernal des oiseaux d’eau

La fonction indicateur_avifaune_isac calcule les conditions d’accueil de l’avifaune dans la période hivernale

Analyse de l’indicateur avifaune sur l’Isac

indicateur_avifaune_isac(
  dat,
  h_favorable = 2.4,
  h_moyen = 2.2,
  mois_debut = "11",
  mois_fin = "4",
  niveau_marais = "isac_niveau_marais"
)

Arguments

dat Un tableau de données, chargé par load_isac et traitement_debit_isac

h_favorable Le niveau favorable à l’accueil d’oiseaux hivernants sur l’Isac

h_moyen Le niveau en dessous duquel l’accueil des oiseaux hivernants devient mauvais

mois_debut
Le mois de début de l’accueil de l’avifaune (inclus)

mois_fin
Le mois de fin de l’accueil de l’avifaune (inclus)

niveau_marais
Le niveau dans les marais, defaut “isac_niveau_marais” voir le jeu de données isac pour les codes possibles

Le programme retourne Ub vecteur (factor) des types pour l’avifaune

5.3 Reproduction du brochet

La fonction indicateur_brochet_isac calcule les conditions d’accueil de l’avifaune dans la période hivernale

indicateur_brochet_isac(
  dat,
  h_favorable = 2.3,
  h_moyen = 2.2,
  debut_ponte = "25/02",
  fin_ponte = "15/03",
  fin_emergence = "01/05",
  niveau_marais = "isac_niveau_marais"
)

Arguments :

dat Un tableau de données, chargé par load_isac et traitement_debit_isac.

h_favorable Le niveau favorable pour la reproduction.

h_moyen Hauteur en dessus de laquelle la reproduction est considérée comme moyenne et et en dessous duquel elle est considérée comme mauvaise.

debut_ponte Date de début de ponte defaut “25/02”

fin_ponte
Date de fin de ponte et début de l’émergence defaut “15/03”

fin_emergence
La date de fin de l’emergence (exclue) defaut “01/05”.

niveau_marais
Le niveau dans les marais, defaut “isac_niveau_marais” voir le jeu de données isac pour les codes possibles.

La fonction retourne : Ub vecteur (factor) des types pour le brochet

note :si on est pas dans la bonne période, pas de calcul du niveau ponte, on prend 2.30 comme référence….)

#data(isac_dat)


# Calcul du débit et de la continuité au niveau de l'ouvrage

debit <-  debit_vannes_isac(
    hamont = isac_dat$isac_amont2,
    haval = isac_dat$pontdecran,
    hvanne1 = isac_dat$isac_position_vanne_1,
    hvanne2 = isac_dat$isac_position_vanne_2
)
isac_dat1 <- cbind(isac_dat, debit)

# cacul des indicateurs avisfaune et brochet
# choisir niveau_marais = "isac_niveau_marais" si la variable est disponible

isac_dat1$avifaune <- indicateur_avifaune_isac(isac_dat1,  niveau_marais="guenrouet")
#> Warning in indicateur_avifaune_isac(isac_dat1, niveau_marais = "guenrouet"):
#> Attention, 300 donnees manquantes sur 52588 pour guenrouet
isac_dat1$brochet <- indicateur_brochet_isac(isac_dat1,  niveau_marais="guenrouet")
#> Warning in indicateur_brochet_isac(isac_dat1, niveau_marais = "guenrouet"):
#> Attention, 300 donnees manquantes sur 52588 pour guenrouet


# Graphique en ggplot, plusieurs graphiques, on notera l'usage de  
#cowplot::plot_grid(... align = "v", axis = 'lr') pour aligner exactement
# plusieurs graphiques sur l'axe des x
# pour tout rassembler en un seul graphique utiliser ggnewscale::new_scale_fill()

g0 <- ggplot(isac_dat1) + 
  geom_line(aes(x=horodate, y= Q, colour="Q-vannes")) +
  geom_line(aes(x=horodate, y = Q_pompes, colour="Q-pompes")) +
  scale_colour_manual("Débit", values=c("Q-vannes"=bleu_EV,"Q-pompes"=orange_EV)) +
  theme_bw()


g1 <-   ggplot(isac_dat1) +
  geom_rect(
    aes(
      xmin = horodate,
      xmax = horodate + as.difftime(10, units = "mins"),
      ymin = -30,
      ymax = -35,
      fill = mig
    )) +
  scale_fill_manual("Transparence migratoire", values = c("1-transparente"="blue",
                                                          "2-difficile"="orange",
                                                          "3-bloquee"="red",
                                                          "4-inf5cm"="purple"))+
  theme_minimal() +
  theme(axis.line.x = element_blank(), axis.line.y = element_blank(), 
        axis.text.x = element_blank(), axis.text.y = element_blank(), 
        axis.ticks.x = element_blank(), axis.ticks.y = element_blank(), 
        axis.title.x = element_blank(), axis.title.y = element_blank())+
    theme(legend.position="bottom",
          legend.title = element_text(size=6),
          legend.text = element_text(size=6),
          legend.key.height =unit(0.4, 'cm'),
          legend.key.width =unit(0.4, 'cm'),
          legend.direction = "horizontal",
          panel.grid.major = element_blank(),
          panel.grid.minor = element_blank())
  

g2 <-  ggplot(isac_dat1) +
  geom_rect(
    aes(
      xmin = horodate,
      xmax = horodate + as.difftime(10, units = "mins"),
      ymin = -40,
      ymax = -45,
      fill = avifaune
    )) +
  scale_fill_manual("Accueil avifaune", values = c("0-bon"="blue",
                                                   "1-moyen"="orange",
                                                   "2-mauvais"="red",
                                                   "3-hors periode"="black",
                                                   "4-inconnu"="grey"))+
  theme_minimal() +
  theme(axis.line.x = element_blank(), axis.line.y = element_blank(), 
        axis.text.x = element_blank(), axis.text.y = element_blank(), 
        axis.ticks.x = element_blank(), axis.ticks.y = element_blank(), 
        axis.title.x = element_blank(), axis.title.y = element_blank())+
  theme(legend.position="bottom",
        legend.title = element_text(size=6),
        legend.text = element_text(size=6),
        legend.key.height =unit(0.4, 'cm'),
        legend.key.width =unit(0.4, 'cm'),
        legend.direction = "horizontal",
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank())


g3 <-  ggplot(isac_dat1) +
  geom_rect(
    aes(
      xmin = horodate,
      xmax = horodate + as.difftime(10, units = "mins"),
      ymin = -50,
      ymax = -55,
      fill = brochet
    )) +
  scale_fill_manual("Repro brochet", values = c("0-repro-bon"="blue",
                                                "1-repro-moyen"="orange",
                                                "2-repro-mauvais"="red",
                                                "3-emergence-bon"="cyan",
                                                "4-emergence-moyen"="gold",
                                                "5-emergence-mauvais"="firebrick",
                                                "6-inconnu/hors periode"="black")) +
  
  
  theme_minimal() +
  theme(axis.line.x = element_blank(), axis.line.y = element_blank(), 
        axis.text.x = element_blank(), axis.text.y = element_blank(), 
        axis.ticks.x = element_blank(), axis.ticks.y = element_blank(), 
        axis.title.x = element_blank(), axis.title.y = element_blank())+
    theme(legend.position="bottom",
          legend.title = element_text(size=6),
          legend.text = element_text(size=6),
          legend.key.height =unit(0.4, 'cm'),
          legend.key.width =unit(0.4, 'cm'),
          legend.direction = "horizontal",
          panel.grid.major = element_blank(),
          panel.grid.minor = element_blank())
  
  
  cowplot::plot_grid(g0, g1, g2, g3, 
          ncol = 1, nrow = 4,  align = "v", axis = 'lr', 
          rel_heights  = c(4,1,1,1.3))